/*
 * All.java
 *
 * Created on 20 marzo 2004, 10.28
 */

package net.ermannofranco.xml.schema;

/**
 * La classe formalizza il tag All, che puo' essere usato all'interno di
 * ComplexType.
 * 
 * @author ermanno (ermanno.franco@gmail.com)
 */
public class All extends SchemaTag implements ITagCollection {

	/**
	 * 
	 */
	private static final long serialVersionUID = -9098177401037777649L;

	/**
	 * Creates a new instance of All Protetto
	 * 
	 * @param level
	 *            contatore di livello per indentazione, gestito automaticamente
	 * @param container
	 *            tag contenitore, automatico
	 */
	protected All(int level, ISchemaTag container) {
		super("all", level, container);

	}

	/**
	 * aggiunge un tag element
	 * 
	 * @return {@link Element}
	 */
	public Element addElem(Element ref) {
		Element e;
		add(e = new Element(getLevel() + 1, this));
		e.setRef(ref);
		return e;
	}

	public Element addElemRef(String refName) {
		Element e;
		add(e = new Element(getLevel() + 1, this));
		e.setRef(refName);
		return e;
	}

	public Element addElem(String name) {
		Element e;
		add(e = new Element(getLevel() + 1, this));
		e.setName(name);
		return e;
	}

	public Element addElem(String name, XmlType type) {
		Element e;
		add(e = new Element(getLevel() + 1, this));
		e.setNameAndType(name, type);
		return e;
	}

	public Element addElem(String name, ContentType typeRef) {
		Element e;
		add(e = new Element(getLevel() + 1, this));
		e.setNameAndType(name, typeRef);
		return e;
	}

	public Element addElem(String name, String typeName) {
		Element e;
		add(e = new Element(getLevel() + 1, this));
		e.setNameAndType(name, typeName);
		return e;
	}

	/**
	 * aggiunge un tag Annotation che contiene un tag Documentation
	 * 
	 * @param explanation
	 *            testo della documentazione
	 * @return riferimento all'oggetto corrente
	 */
	public All addDocumentation(String explanation) {
		addAnnotation().addDocumentation(explanation);
		return this;
	}

	/**
	 * aggiunge un tag Annotation che contiene un tag Documentation
	 * 
	 * @param explanation
	 *            testo della documentazione
	 * @param language
	 *            attributo di xml:lang, seguire le regole di i18n
	 * @return riferimento all'oggetto corrente
	 */
	public All addDocumentation(String explanation, String language) {
		addAnnotation().addDocumentation(explanation, language);
		return this;
	}

	public All setZeroMinOccurs() {
		addAttr("minOccurs", "0");
		return this;
	}

	public All setOneMinOccurs() {
		addAttr("minOccurs", "1");
		return this;
	}

	public All setOneMaxOccurs() {
		addAttr("maxOccurs", "1");
		return this;
	}
}
